Docker 101 - Desde cero hasta containerizar nuestra primera aplicación.
En este post vamos a aprender qué es Docker, cómo utilizarlo, cuándo es apropiado hacerlo y crearemos nuestro primer contenedor para aislar una aplicación ficticia basada en un escenario de producción.
Antes de adentrarnos en el mundo de Docker, debemos tener claros unos conceptos básicos.
- ¿Qué es un contenedor?
- ¿Qué es Docker?
- Qué no es Docker.
- Instalación de Docker
- Lanzando nuestro primer contenedor, y un vistazo al interior de Docker.
- Añadiendo almacenamiento persistente.
- Redes.
- Ejemplo: Containerizando una hipotética aplicación en producción.
- Eliminando todas las imágenes, volúmenes y contenedores en ejecución.
- Conclusiones.
¿Qué es un contenedor?
Explicado de forma muy simplificada: Un contenedor es un híbrido entre una versión más avanzada de chroot y una alternativa ligera a la virtualización.
Un contenedor es una instancia aislada a nivel de usuario del sistema operativo. Desde el punto de vista de una aplicación que se ejecuta en un contenedor, esta instancia es un ordenador independiente; y sólo tiene acceso a los recursos explícitamente asignados al contenedor.
Los contenedores comparten el núcleo y la API del sistema con el sistema operativo anfitrión, reduciendo así los recursos necesarios para ejecutar un contenedor comparado con la virtualización tradicional. La desventaja de este diseño es que el contenedor debe ejecutar el mismo sistema operativo que el anfitrión, no puedes lanzar un contenedor de una aplicación Windows en un sistema anfitrión basado en Linux.
Ventajas y desventajas de utilizar contenedores.
Las principales ventajas del uso de contenedores son las siguientes:
-
Podemos empaquetar aplicaciones junto con sus dependencias, creando así una versión portable de la aplicación y eliminando el temido “pero en mi máquina funciona”. Esto nos ayuda a simplificar el proceso de despliegue de una aplicación, y es un paso más para eliminar el metafórico muro que separa Operaciones y Desarrollo.
-
Requiere de pocos recursos de sistema adicionales, comparado con ejecutar la aplicación directamente. Esto nos permite conseguir una mayor densidad y aprovechamiento de los recursos de hardware comparado con la virtualización tradicional.
-
Reduce el esfuerzo necesario para mantener el entorno de ejecución, junto con su complejidad. En un contenedor nuestra aplicación o servicio se convierte en un paquete redistribuible, garantizando así que su ejecución será la misma en un entorno de pruebas que en uno de producción.
-
Dado que el entorno de ejecución se declara en texto plano, nos beneficiamos de las ventajas de IaC: Ahora podemos versionar el entorno y la configuración de la aplicación, revirtiendo y re-desplegando con alta velocidad y fiabilidad.
Por supuesto, no todo son ventajas:
-
Un contenedor consume recursos adicionales comparado con la ejecución directa tradicional.
-
Los contenedores comparten el núcleo con el anfitrión. Cualquier bug o glitch en el núcleo afecta a todos los contenedores.
-
La gestión de un alto número de contenedores es compleja. Existen herramientas para mitigar este aspecto, como Docker Swarm y Google Kubernetes.
-
Las aplicaciones con interfaz gráfico no son fácilmente containerizables. Los contenedores están orientados al aislamiento de servicios. Aunque podemos utilizar soluciones alternativas como redirección de X11, no es fácil y tiene su propio set de desventajas.